/*
 * replace.c
 *
 *  Created on: 16/06/2009
 *      Author: alex
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/*
 * Lê um arquivo e passa todo o seu conteúdo para um string, que precisa ser
 * desalocada depois.
 */
char *file2string(FILE *file) {
	fputs("           \n", file);
	fseek(file, 0, SEEK_END);
	char *string;
	int string_length = ftell(file) - 5;
	string = calloc(string_length + 1, sizeof(char));
	if (string == NULL) {
		fputs("Não foi possível alocar uma string para guardar o conteúdo do arquivo com as coordenadas da formiga (função file2string).", stderr);
		exit(EXIT_FAILURE);
	}
	fseek(file, 0, SEEK_SET);
	if (ftell(file) != 0) {
		fputs("Não foi possível voltar ao início do arquivo (função file2string).", stderr);
		exit(EXIT_FAILURE);
	}
	char c = ' ';
	for (int i = 0; i < string_length; i++) {
		if ((c = fgetc(file)) == EOF) {
			fputs("Não foi possível ler o arquivo com as coordenadas da formiga (função file2string).", stderr);
			exit(EXIT_FAILURE);
		}
		string[i] = c;
	}
	//fclose(file);
	//fopen("formiga0", "w+");
	return string;
}


/*
 * Troca a primeira ocorrência de uma substring por outra.
 */
char *strrep(const char *before, const char *old, const char *new) {
	char *after;
	int before_length = strlen(before);
	int old_length = strlen(old);
	int new_length = strlen(new);
	int after_length = before_length - old_length + new_length;
	after = calloc(after_length + 1, sizeof(char));
	int offset = strstr(before, old) - before;
	memcpy(after, before, offset);
	strcpy(&after[offset], new);
	strcpy(&after[offset + new_length], &before[offset + old_length]);
	return after;
}


/*
 * Troca cada ocorrência das strings em olds pela string de mesmo índice no
 * array news. As string são procuradas no arquivo input e o resultado é salvo
 * no arquivo output.
 */
void frep(FILE *input, FILE *output, int size, char **olds, char **news) {
	char *old, *new, *before = file2string(input), *after;
	for (int i = 0; i < size; i++) {
		old = olds[i];
		new = news[i];
		after = strrep(before, old, new);
		free(before);
		before = after;
	}
	fputs(before, output);
}
